package pe.edu.upc.karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import pe.edu.upc.karaoke.excepcion.DAOExcepcion;
import pe.edu.upc.karaoke.modelo.*;
import pe.edu.upc.karaoke.util.ConexionBD;


public class LocalDAO extends BaseDAO {
		
	public Local obtener(int idlocal) throws DAOExcepcion {
		
		Local local = new Local();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query = "SELECT IDLOCAL, NOMBRE, DESCRIPCION FROM LOCAL WHERE IDLOCAL=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idlocal);
				rs = stmt.executeQuery();
				
				if (rs.next()) {
					local.setIdlocal(rs.getInt(1));
					local.setNombre(rs.getString(2));
					local.setDescripcion(rs.getString(3));
			}
		} catch (SQLException e) {
				local = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return local;
	}

	
	public List<Local> buscarPorNombre(String nombre) throws DAOExcepcion {
		
		Local local = new Local();
		List<Local> lista = new ArrayList<Local>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"SELECT L.*, A.DNI AS DNI_ADMINISTRADOR FROM LOCAL L, ADMINISTRADOR A " +
								"WHERE L.NOMBRE LIKE ? " +
								"AND L.IDADMINISTRADOR = A.IDADMINISTRADOR ";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, "%" + nombre + "%");
				rs = stmt.executeQuery();
				
				while (rs.next()) {
					local.setIdlocal(rs.getInt("IDLOCAL"));
					local.setNombre(rs.getString("NOMBRE"));
					local.setDescripcion(rs.getString("DESCRIPCION"));
					
					Administrador administrador = new Administrador();
					administrador.setIdAdministrador(rs.getInt("IDADMINISTRADOR"));
					administrador.setDni(rs.getInt("DNI_ADMINISTRADOR"));
					
					lista.add(local);
				}
		} 
		catch (SQLException e) {
				local = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}

	
	public Local insertar(Local local) throws DAOExcepcion {
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"INSERT INTO LOCAL (NOMBRE, DIRECCION, TELEFONO, CORREO, DESCRIPCION, ELOG, IDADMINISTRADOR) " +
								"VALUES (?,?,?,?,?,?,?)";
				
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, local.getNombre());
				stmt.setString(2, local.getDireccion());
				stmt.setString(3, local.getTelefono());
				stmt.setString(4, local.getCorreo());
				stmt.setString(5, local.getDescripcion());
				stmt.setInt(6, local.getElog());
				stmt.setInt(7, local.getAdministrador().getIdAdministrador());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO INSERTAR");
				}
	
				int id = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					id = rs.getInt(1);
				}
				local.setIdlocal(id);

		} catch (SQLException e) {
				local = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return local;
	}

	
	public String eliminar(int idlocal) throws DAOExcepcion {
		
		Local local = new Local();
		Connection con = null;
		PreparedStatement stmt = null;
		
		String vReturn = "NO_OK";
		try {
				String query = "DELETE FROM LOCAL WHERE IDLOCAL=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setInt(1, idlocal);
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ELIMINAR");
				}else{
					vReturn = "OK";
				}
		} catch (SQLException e) {
				local = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return vReturn;
	}

	
	public Local actualizar(Local local) throws DAOExcepcion {
		
		Connection con = null;
		PreparedStatement stmt = null;
		
		try {
				String query =	"UPDATE LOCAL SET NOMBRE=?, DIRECCION=?, TELEFONO=?, CORREO=?, DESCRIPCION=?, IDADMINISTRADOR=? " +
								"WHERE IDLOCAL=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, local.getNombre());
				stmt.setString(2, local.getDireccion());
				stmt.setString(3, local.getTelefono());
				stmt.setString(4, local.getCorreo());
				stmt.setString(5, local.getDescripcion());
				stmt.setInt(6, local.getAdministrador().getIdAdministrador());
				stmt.setInt(7, local.getIdlocal());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO ACTUALIZAR");
				}
		} catch (SQLException e) {
				local = null;	
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return local;
	}
	
}
